package com.haixiaoke.saas.order.mapper;

import com.haixiaoke.saas.apartment.domain.OrderVO;
import com.haixiaoke.saas.house.domain.House;
import com.haixiaoke.saas.order.domain.Order;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;


/**
 * 订单Mapper接口
 *
 * @author qixi
 * @date 2024-03-04
 */
public interface OrderMapper {
    /**
     * 查询订单
     *
     * @param orderId 订单主键
     * @return 订单
     */
    Order selectOrderByOrderId(String orderId);

    /**
     * 查询订单列表和承租人
     */
    List<Order> selectOrderListByOrderLesseeInfo(Order order);

    /**
     * 查询订单列表
     *
     * @param order 订单
     * @return 订单集合
     */
    List<Order> selectOrderList(Order order);

    /**
     * 新增订单
     *
     * @param order 订单
     * @return 结果
     */
    int insertOrder(Order order);

    /**
     * 修改订单
     *
     * @param order 订单
     * @return 结果
     */
    int updateOrder(Order order);

    /**
     * 删除订单
     *
     * @param orderId 订单主键
     * @return 结果
     */
    int deleteOrderByOrderId(String orderId);

    /**
     * 批量删除订单
     *
     * @param orderIds 需要删除的数据主键集合
     * @return 结果
     */
    int deleteOrderByOrderIds(String[] orderIds);

    List<Order> selectOrderValidList(Order order);

    /**
     * 房态订单查询
     *
     * @param order
     * @return
     */
    List<OrderVO> conditionList(Order order);

    /**
     * 房态订单查询-卡片模式
     *
     * @param house
     * @return
     */
    List<House> conditionCard(House house);

    int checkRepeatOrder(Order order);

    List<Order> selectOvertimeOrder();

    List<Order> preOrderSignOvertime();

    /**
     * 校验短租订单时间段内是否有订单出租
     *
     * @param startTime
     * @param endTime
     * @param houseId
     * @return
     */
    int checkRepeatShortOrder(@Param("startTime") Date startTime, @Param("endTime") Date endTime, @Param("houseId") String houseId);

    /**
     * 根据登录用户查询订单
     *
     * @param order
     * @return
     */
    List<Order> selectOrderByUserId(Order order);

    /**
     * 根据登录用户查询退款订单
     *
     * @param order
     * @return
     */
    List<Order> selectRefundOrderByUserId(Order order);

    /**
     * 根据订单id，查询续租订单集合
     *
     * @param orderId
     * @return
     */
    List<Order> selectOrderByLinkedOrderId(String orderId);

    /**
     * 根据关联订单id，删除关联订单
     *
     * @param orderId
     * @return
     */
    int deleteOrderByLinkedOrderId(String orderId);

    /**
     * 查询公寓订单列表
     */
    List<Order> selectApartmentOrderList(Order order);

    /**
     * 检验续租订单是否是未支付
     * @param orderId
     * @return
     */
    int checkLinkedOrderState(String orderId);

    /**
     * 换房，修改父订单及子订单的关联house_id
     * @param order
     * @return
     */
    int apartmentExchangeHouse(Order order);

    int updateBatchOrder(List<Order> orderList);

    int countOrderState(@Param("userId") Long userId, @Param("orderState") String orderState);

    /**
     * 查看最新的续租订单
     *
     * @param orderId
     * @return
     */
    Order selectNewOrderByLinkedOrderId(String orderId);

    int checkLinkedOrder(String orderId);

    List<Order> selectOrderByHouseIds(String[] houseIds);

    List<Order> selectOrderByHouseIdAndCheckIn(String houseId);

    List<Order> selectAddBillList(Order order);

    /**
     * 根据订单id，将退款金额更新为null
     *
     * @param orderId
     * @return
     */
    int updateOrderRefundAmount(String orderId);

    List<OrderVO> selectRentTimeList(String houseId);

    List<Order> selectEffectiveOrderByHouseId(String houseId);

    /**
     * 根据订单Id校验租客合同是否能出租,是否有未签合同
     *
     * @param orderId
     * @return
     */
    Order selectLesseeContractStateByOrderId(String orderId);

    int checkReturnOrderByOrderId(String orderId);
}
